package com.netty.demo.client.demo.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageEncoder;

import java.net.InetSocketAddress;
import java.util.List;

/**
 * @author Administrator 余秀良
 * @version 1.0
 * <p>date: 2019年09月21日  14:18 </p>
 * <p>address: 四川成都 </p>
 */
public class ClientEncoder extends MessageToMessageEncoder<RequestProtocol> {
    private final InetSocketAddress remoteAddress;

    //LogEventEncoder 创建了即将被发送到指定的 InetSocketAddress
    // 的 DatagramPacket 消息
    public ClientEncoder(InetSocketAddress remoteAddress) {
        this.remoteAddress = remoteAddress;
    }


    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, RequestProtocol requestProtocol, List<Object> list) throws Exception {
        byte[] msg = requestProtocol.getData();
        /* byte     1字节      1 个
         * short    2字节
         * int      4字节      3 个
         * long     8字节      2 个
         */
        //容量的计算  包头+协议版本+加协议长度+消息id+发送时间+一个分隔符+数据长度
        ByteBuf buf = channelHandlerContext.alloc().buffer(1 + 4 * 3 + 8 * 2 + msg.length);
        //协议    包头:协议版本:协议长度:消息id:发送时间:数据
        //包头
        buf.writeInt(requestProtocol.getHead());
        //协议版本
        buf.writeInt(1);
        //协议长度
        buf.writeInt(requestProtocol.getLength());
        //将消息id写入到 ByteBuf中
        buf.writeLong(requestProtocol.getMessageId());
        //将发送时间写入到 ByteBuf中
        buf.writeLong(requestProtocol.getTime());
        //将命令号写入
        buf.writeShort(requestProtocol.getCmd());
        //添加一个 SEPARATOR
        buf.writeByte(RequestProtocol.SEPARATOR);
        //将消息写入 ByteBuf中
        buf.writeBytes(msg);
        //防止黏包
        //buf.writeBytes(new byte[]{'\r','\n'});
        //将一个拥有数据和目的地地址的新 DatagramPacket 添加到出站的消息列表中
        list.add(new DatagramPacket(buf, remoteAddress));
    }
}
